#ifndef OMG_DDS_XTYPES_FWD_HPP_
#define OMG_DDS_XTYPES_FWD_HPP_


/* Copyright 2010, Object Management Group, Inc.
 * Copyright 2010, PrismTech, Corp.
 * Copyright 2010, Real-Time Innovations, Inc.
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT

class OMG_DDS_ALIAS_TYPE_DELEGATE;
class OMG_DDS_ANNOTATION_DESCRIPTOR_DELEGATE;
class OMG_DDS_ANNOTATION_MEMBER_DELEGATE;
class OMG_DDS_ANNOTATION_MEMBER_VALUE_DELEGATE;
class OMG_DDS_ANNOTATION_USAGE_MEMBER_DELEGATE;
class OMG_DDS_ANNOTATION_TYPE_DELEGATE;
class OMG_DDS_ANNOTATION_USAGE_DELEGATE;
class OMG_DDS_ARRAY_TYPE_DELEGATE;
class OMG_DDS_BIT_DELEGATE;
class OMG_DDS_BIT_SET_TYPE_DELEGATE;
class OMG_DDS_DYNAMIC_DATA_DELEGATE;
class OMG_DDS_DYNAMIC_DATA_FACTORY_DELEGATE;
class OMG_DDS_DYNAMIC_TYPE_DELEGATE;
class OMG_DDS_DYNAMIC_TYPE_FACTORY_DELEGATE;
class OMG_DDS_DYNAMIC_TYPE_MEMBER_DELEGATE;
class OMG_DDS_ENUMERATED_CONSTANT_DELEGATE;
class OMG_DDS_ENUMERATION_TYPE_DELEGATE;
class OMG_DDS_KEYED_BYTES_DELEGATE;
class OMG_DDS_KEYED_STRING_DELEGATE;
class OMG_DDS_MAP_TYPE_DELEGATE;
class OMG_DDS_MEMBER_DESCRIPTOR_DELEGATE;
class OMG_DDS_MEMBER_PROPERTY_DELEGATE;
class OMG_DDS_MODULE_DELEGATE;
class OMG_DDS_SEQUENCE_TYPE_DELEGATE;
class OMG_DDS_STRING_TYPE_DELEGATE;
class OMG_DDS_STRUCTURE_MEMBER_DELEGATE;
class OMG_DDS_STRUCTURE_TYPE_DELEGATE;
class OMG_DDS_TYPE_DESCRIPTOR_DELEGATE;
class OMG_DDS_TYPE_PROPERTY_DELEGATE;
class OMG_DDS_TYPE_LIBRARY_DELEGATE;
class OMG_DDS_TYPE_LIBRARY_ELEMENT_DELEGATE;
class OMG_DDS_TYPE_OBJECT_DELEGATE;
class OMG_DDS_TYPE_DELEGATE;
class OMG_DDS_UNION_MEMBER_DELEGATE;
class OMG_DDS_UNION_TYPE_DELEGATE;


namespace dds {
    namespace type {
//        enum TypeKind;

        // --- Bound: --- //
        /** Bound of a collection type */
        typedef unsigned long Bound;

        typedef std::vector<Bound> BoundSeq;

        const Bound UNBOUNDED_COLLECTION = 0;

        // --- Member ID: --- //
        /** ID of a type member */
        typedef unsigned long MemberId;

        // --- Union case label sequence: --- //
        /** Case labels that apply to a member of a union type */
        typedef std::vector<int32_t> UnionCaseLabelSeq;

        // --- Built-in Types: --- //
        namespace builtin {
            // --- Bytes: --- //
            class OMG_DDS_API BytesDataReader;
            class OMG_DDS_API BytesDataWriter;

            // --- Keyed bytes: --- //
            typedef tdds::type::builtin::KeyedBytes<OMG_DDS_KEYED_BYTES_DELEGATE>
            KeyedBytes;

            class OMG_DDS_API KeyedBytesDataReader;
            class OMG_DDS_API KeyedBytesDataWriter;

            // --- Keyed string: --- //
            typedef tdds::type::builtin::KeyedString<OMG_DDS_KEYED_STRING_DELEGATE>
            KeyedString;

            class OMG_DDS_API KeyedStringDataReader;
            class OMG_DDS_API KeyedStringDataWriter;

            // --- String: --- //
            class OMG_DDS_API StringDataReader;
            class OMG_DDS_API StringDataWriter;
        }

        // --- Dynamic Language Binding: --- //
        namespace dynamic {
            // --- Annotation descriptor: --- //
            typedef tdds::type::dynamic::AnnotationDescriptor<OMG_DDS_ANNOTATION_DESCRIPTOR_DELEGATE>
            AnnotationDescriptor;

            typedef std::vector<AnnotationDescriptor> AnnotationDescriptorSeq;

            // --- Dynamic data: --- //
            typedef tdds::type::dynamic::DynamicData<OMG_DDS_DYNAMIC_DATA_DELEGATE>
            DynamicData;

            // --- Dynamic data factory: --- //
            typedef tdds::type::dynamic::DynamicDataFactory<OMG_DDS_DYNAMIC_DATA_FACTORY_DELEGATE>
            DynamicDataFactory;

            // --- Dynamic type: --- //
            typedef tdds::type::dynamic::DynamicType<OMG_DDS_DYNAMIC_TYPE_DELEGATE>
            DynamicType;

            // --- Dynamic type factory: --- //
            typedef tdds::type::dynamic::DynamicTypeFactory<OMG_DDS_DYNAMIC_TYPE_FACTORY_DELEGATE>
            DynamicTypeFactory;

            // --- Dynamic type member: --- //
            typedef tdds::type::dynamic::DynamicTypeMember<OMG_DDS_DYNAMIC_TYPE_MEMBER_DELEGATE>
            DynamicTypeMember;

            typedef std::map<std::string, DynamicTypeMember>
            DynamicTypeMembersByName;

            typedef std::map<dds::type::MemberId, DynamicTypeMember>  
            DynamicTypeMembersById;

            // --- Include path sequence: --- //
            typedef std::vector<std::string> IncludePathSeq;
            
            // --- Member descriptor: --- //
            typedef tdds::type::dynamic::MemberDescriptor<OMG_DDS_MEMBER_DESCRIPTOR_DELEGATE>
            MemberDescriptor;
            
            // --- Parameters: --- //
            typedef std::map<std::string, std::string> Parameters;

            // --- Type descriptor: --- //
            typedef tdds::type::dynamic::TypeDescriptor<OMG_DDS_TYPE_DESCRIPTOR_DELEGATE>
            TypeDescriptor;
        }

        // --- Type Object Type Representation: --- //
        namespace typeobject {
            // --- Alias type: --- //
            typedef tdds::type::typeobject::AliasType<OMG_DDS_ALIAS_TYPE_DELEGATE>
            AliasType;

            // --- Annotation member: --- //
            typedef tdds::type::typeobject::AnnotationMember<OMG_DDS_ANNOTATION_MEMBER_DELEGATE>
            AnnotationMember;

            typedef std::vector<AnnotationMember> AnnotationMemberSeq;

            // --- Annotation member value: --- //
            typedef tdds::type::typeobject::AnnotationMemberValue<OMG_DDS_ANNOTATION_MEMBER_VALUE_DELEGATE>
            AnnotationMemberValue;

            // --- Annotation type: --- //
            typedef tdds::type::typeobject::AnnotationType<OMG_DDS_ANNOTATION_TYPE_DELEGATE>
            AnnotationType;
            
            // --- Annotation usage: --- //
            typedef tdds::type::typeobject::AnnotationUsage<OMG_DDS_ANNOTATION_USAGE_DELEGATE>
            AnnotationUsage;

            typedef std::vector<AnnotationUsage> AnnotationUsageSeq;

            // --- Annotation usage member: --- //
            typedef tdds::type::typeobject::AnnotationUsageMember<OMG_DDS_ANNOTATION_USAGE_MEMBER_DELEGATE>
            AnnotationUsageMember;

            typedef std::vector<AnnotationUsageMember> AnnotationUsageMemberSeq;

            // --- Array type: --- //
            typedef tdds::type::typeobject::ArrayType<OMG_DDS_ARRAY_TYPE_DELEGATE>
            ArrayType;

            // --- Bit: --- //
            typedef tdds::type::typeobject::Bit<OMG_DDS_BIT_DELEGATE> Bit;

            typedef std::vector<Bit> BitSeq;

            // --- Bit set type: --- //
            typedef tdds::type::typeobject::BitSetType<OMG_DDS_BIT_SET_TYPE_DELEGATE>
            BitSetType;

            // --- Enumerated constant: --- //
            typedef tdds::type::typeobject::EnumeratedConstant<OMG_DDS_ENUMERATED_CONSTANT_DELEGATE>
            EnumeratedConstant;

            typedef std::vector<EnumeratedConstant> EnumeratedConstantSeq;

            // --- Enumeration type: --- //
            typedef tdds::type::typeobject::EnumerationType<OMG_DDS_ENUMERATION_TYPE_DELEGATE>
            EnumerationType;
            
            // --- Map type: --- //
            typedef tdds::type::typeobject::MapType<OMG_DDS_MAP_TYPE_DELEGATE>
            MapType;

            // --- Member property: --- //
            typedef tdds::type::typeobject::MemberProperty<OMG_DDS_MEMBER_PROPERTY_DELEGATE>
            MemberProperty;

            // --- Module: --- //
            typedef tdds::type::typeobject::Module<OMG_DDS_MODULE_DELEGATE>
            Module;

            // --- Sequence type: --- //
            typedef tdds::type::typeobject::SequenceType<OMG_DDS_SEQUENCE_TYPE_DELEGATE>
            SequenceType;

            // --- String type: --- //
            typedef tdds::type::typeobject::StringType<OMG_DDS_STRING_TYPE_DELEGATE>
            StringType;

            // --- Structure member: --- //
            typedef tdds::type::typeobject::StructureMember<OMG_DDS_STRUCTURE_MEMBER_DELEGATE>
            StructureMember;

            typedef std::vector<StructureMember> StructureMemberSeq;

            // --- Structure type: --- //
            typedef tdds::type::typeobject::StructureType<OMG_DDS_STRUCTURE_TYPE_DELEGATE>
            StructureType;

            // --- Type ID --- //
            typedef long TypeId;

            // --- Type library: --- //
            typedef tdds::type::typeobject::TypeLibrary<OMG_DDS_TYPE_LIBRARY_DELEGATE>
            TypeLibrary;

            // --- Type library element: --- //
            typedef tdds::type::typeobject::TypeLibraryElement<OMG_DDS_TYPE_LIBRARY_ELEMENT_DELEGATE>
            TypeLibraryElement;

            typedef std::vector<TypeLibraryElement> TypeLibraryElementSeq;

            // --- Type library: --- //
            typedef tdds::type::typeobject::TypeObject<OMG_DDS_TYPE_OBJECT_DELEGATE>
            TypeObject;

            // --- Type property: --- //
            typedef tdds::type::typeobject::TypeProperty<OMG_DDS_TYPE_PROPERTY_DELEGATE>
            TypeProperty;

            // --- Union member: --- //
            typedef tdds::type::typeobject::UnionMember<OMG_DDS_UNION_MEMBER_DELEGATE>
            UnionMember;
            
            typedef std::vector<UnionMember> UnionMemberSeq;

            // --- Union type: --- //
            typedef tdds::type::typeobject::UnionType<OMG_DDS_UNION_TYPE_DELEGATE>
            UnionType;
        }
    }
}

#endif  // OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT


#endif // !defined(OMG_DDS_XTYPES_FWD_HPP_)
